#include "xorcrypto.h"
#include <stdlib.h>
#include <string.h>


#define DEFAULT_KEY_INFO    "pml@123!!"


#if 0
// 获取异或种子
long getXORSeed(const char* pKey)
{
    if (!pKey) {
        return 0;
    }

    unsigned int uiLen = strlen(pKey);
    if (32 < uiLen) {
        return 0;
    }

    long lSeed = 0;
    for (unsigned int i = 0; i < uiLen; ++i) {
        lSeed = lSeed * 4 + pKey[i];
    }

    return lSeed;
}
#endif

// 异或加解密算法：在异或加解密中，这个过程是可逆的。
// 加密：将明文与密钥进行逐位异或运算得到密文。
// 解密：密文和同样的密钥进行异或运算得到明文。
// return：0-成功，非0-失败
int XORCrypto(const char* pInData, unsigned int uiInLen
              , const char* pKey, unsigned int uiKeyLen
              , char* pOutData, unsigned int uiOutLen)
{
    memset(pOutData, 0, uiOutLen);

    if (!pInData || !pOutData || !pKey || (uiInLen > uiOutLen)) {
        return -1;
    }

    for (unsigned int i = 0; i < uiInLen; ++i) {
        pOutData[i] = pInData[i] ^ pKey[i % uiKeyLen];
    }

    return 0;
}

// 异或加解密算法：在异或加解密中，这个过程是可逆的。
// 加密：将明文与密钥进行逐位异或运算得到密文。
// 解密：密文和同样的密钥进行异或运算得到明文。
// return：0-成功，非0-失败
int XORCryptoByDefaultKey(const char* pInData, unsigned int uiInLen
                          , char* pOutData, unsigned int uiOutLen)
{
    memset(pOutData, 0, uiOutLen);

    if (!pInData || !pOutData || (uiInLen > uiOutLen)) {
        return -1;
    }

    char szKey[16] = {0};
    memcpy(szKey, DEFAULT_KEY_INFO, strlen(DEFAULT_KEY_INFO));
    unsigned int uiKeyLen = strlen(szKey);

    for (unsigned int i = 0; i < uiInLen; ++i) {
        pOutData[i] = pInData[i] ^ szKey[i % uiKeyLen];
    }

    return 0;
}

